package com.cast.health.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.cast.health.entity.PageResult;
import com.cast.health.entity.QueryPageBean;
import com.cast.health.entity.Result;
import com.cast.health.pojo.CheckGroup;
import com.cast.health.pojo.CheckItem;
import com.cast.health.service.CheckGroupService;
import com.cast.health.uitls.MessageConstant;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;


@RestController
@RequestMapping("/checkgroup")
public class CheckGroupController {

    @Autowired
    private CheckGroupService service;

    /**
     * 添加检查组,并添加检查组和检查项的中间关联表
     *
     * @param checkGroup
     * @return
     */
    @PostMapping("/add.do")
    public Result add(@RequestBody CheckGroup checkGroup, Integer[] checkitemIds) {
        //检查参数
        if (checkGroup == null) {
            return new Result(false, "参数异常", null); //参数异常
        }
        //根据code属性条件查询,判断该条数据是否已经存在
        LambdaQueryWrapper<CheckGroup> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(CheckGroup::getCode, checkGroup.getCode());
        CheckGroup one = service.getOne(wrapper);

        if (one != null) {//代表该项目组存在,则不需要添加
            return new Result(false, "添加失败,该项目组已经存在", null);
        }

        //添加检查组信息
        boolean save = service.save(checkGroup);

        //获得新添加的检查组的id
        Integer id = checkGroup.getId();
        System.out.println(id);

        //在中间表当中建立关联
        //获取检查项的id,传入
        if (checkitemIds == null) {
            return new Result(false, "当前没有添加检查项", null);
        }
        //添加中间表数据
        service.addGroupAndItem(id, checkitemIds);

        if (save == false) {
            return new Result(false, MessageConstant.ADD_CHECKGROUP_FAIL, null);
        }
        return new Result(true, MessageConstant.ADD_CHECKGROUP_SUCCESS, save);
    }

    /**
     * 分页查询
     * 条件查询
     *
     * @param page
     * @return
     */
    @PostMapping("/findPage.do")
    public PageResult findPage(@RequestBody QueryPageBean page) {
        //检查参数,当页码和每页展示的数量小于0
        if (page.getCurrentPage() <= 0 || page.getPageSize() <= 0) {
            return null; //参数异常
        }
        //分页拦截器
        IPage<CheckGroup> pageInfo = new Page<>(page.getCurrentPage(), page.getPageSize());
        //条件查询拦截器:编码,名称,助记码
        LambdaQueryWrapper<CheckGroup> wrapper = new LambdaQueryWrapper<>();
        //判断当条件不为空,添加编码,名称,助记码三个字段到拦截器
        if (page.getQueryString() != null) {
            wrapper.like(CheckGroup::getCode, page.getQueryString())  //模糊匹配code
                    .or().like(CheckGroup::getName, page.getQueryString())  //模糊匹配name
                    .or().like(CheckGroup::getHelpCode, page.getQueryString()); //模糊匹配helpcode
        }

        wrapper.orderByAsc(CheckGroup::getCode);

        //调用service查询page
        IPage<CheckGroup> page1 = service.page(pageInfo, wrapper);
        //判断该条件下是否有数据
        if (page1 == null) {
            return new PageResult(null, null);
        }
        //返回总记录数,当页数据
        return new PageResult(page1.getTotal(), page1.getRecords());
    }

    /**
     * 按照id查询对象
     * 回显数据
     *
     * @param id
     * @return
     */
    @GetMapping("/findById.do")
    public Result getById(Integer id) {
        //检查参数
        if (id == 0) {
            return new Result(false, "参数异常");
        }
        //调用service查询得到对象
        CheckGroup byId = service.getById(id);
        //判断查询到的对象是否为空
        if (byId == null) {
            return new Result(false, MessageConstant.ADD_CHECKGROUP_FAIL, null);
        }
        //查询成功,回显数据
        return new Result(true, MessageConstant.ADD_CHECKGROUP_SUCCESS, byId);
    }

    /**
     * 修改对象数据信息  根据id
     *
     * @param checkGroup
     * @return
     */
    @PostMapping("/edit.do")
    public Result update(@RequestBody CheckGroup checkGroup,Integer [] checkitemIds) {
        //检查参数
        if (checkGroup == null) {
            return new Result(false, "参数异常!", null);
        }
        //根据id查询该对象
        CheckGroup cg = service.getById(checkGroup.getId());
        //判断是否存在该对象
        if (cg == null) {
            return null; //查询该id对象不存在
        }
        //调用service修改检查组属性
        boolean byId = service.updateById(checkGroup);

        //如果有新增检查项,添加检查项,更新中间表数据
        Integer id = checkGroup.getId();
        service.addGroupAndItem(id,checkitemIds);

        if (byId == false) {
            //修改失败
            return new Result(false, MessageConstant.EDIT_CHECKGROUP_FAIL, null);
        }
        //修改成功,返回数据信息
        return new Result(true, MessageConstant.EDIT_CHECKGROUP_SUCCESS, byId);
    }


    /**
     * 根据id查询出该对象,并删除
     * 得判断,该id查询的检查组是否存在于检查项,
     *
     * @param id
     * @return
     */
    @GetMapping("/delete.do")
    public Result deleteById(Integer id) {
        //检查参数
        if (id == 0) {
            return new Result(false, "参数异常!", null);
        }
        //根据该id查询看是否存在该对象
        CheckGroup byId = service.getById(id);
        //如果不存在,返回信息
        if (byId == null) {
            return new Result(false, "该对象不存在!", null);
        }
        //存在调用service删掉
        boolean byId1 = service.removeById(id);
        if (byId1 == false) {
            return new Result(false, MessageConstant.DELETE_CHECKGROUP_FAIL, null);
        }
        //删除成功,反回信息
        return new Result(true, MessageConstant.DELETE_CHECKGROUP_SUCCESS, byId1);
    }


    /**
     * \
     * 根据检查组的id,查询检查项
     *
     * @param id
     * @return
     */
    @GetMapping("/findCheckItemIdsByCheckGroupId.do")
    public Result findCheckItemIdsByCheckGroupId(Integer id) {
        //检查参数
        if (id == 0) {
            return new Result(false, "参数异常!", null);
        }
        List<CheckItem> checkItems = service.selectByCheckItemId(id);
        //得到所有数据,编列得到每一个数据的id

        Integer[] ids = new Integer[checkItems.size()];
        for (int i = 0; i < checkItems.size(); i++) {
            ids[i] = checkItems.get(i).getId();
        }
        return new Result(true, "查询成功!", ids);
    }


    @GetMapping("/findAll.do")
    public Result findAll() {
        //调用service查询
        List<CheckGroup> list = service.list();
        //判断一下该集合是否有数据
        if (list.size() == 0) {
            return new Result(false, MessageConstant.QUERY_CHECKGROUP_FAIL, list); //没查到数据
        }
        //返回到所有对象
        return new Result(true, MessageConstant.QUERY_CHECKGROUP_SUCCESS, list);
    }

}
